package com.example.wiki.auth.controller;


import com.example.wiki.auth.entity.TokenBean;
import com.example.wiki.auth.entity.Wikiuser;
import com.example.wiki.auth.service.GiteeOAuthService;
import com.example.wiki.auth.service.UserService;
import com.example.wiki.req.UserSaveReq;
import com.example.wiki.resp.CommonResp;
import com.example.wiki.resp.GiteeUserTokenResp;

import org.apache.tomcat.jni.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import com.example.wiki.req.UserLoginReq;
@RestController
@RequestMapping("/user")
public class GiteeOAuthController {

    @Resource
    private GiteeOAuthService giteeOAuthService;
    @Resource
    private UserService userService;

    private static final Logger Log = LoggerFactory.getLogger(UserController.class);


    @Resource
    private RedisTemplate redisTemplate;


    /**
     * 通过Gitee的授权代码换取访问令牌。
     * <p>
     * 此方法是一个RESTful API端点，专门用于处理Gitee登录流程的最后一步。
     * 它接收Gitee授权服务器返回的授权代码，并用它来换取访问令牌。
     *
     * @param code Gitee授权流程中返回的授权代码，用于换取访问令牌。
     * @return 返回一个包含访问令牌的响应实体。
     */
    @PostMapping("/giteelogin")
    public CommonResp<GiteeUserTokenResp> exchangeCodeForAccessToken(@RequestBody Map<String,String> datamap) {
        String code = datamap.get("data");
        Log.info("Received data: {}", code);

        TokenBean tokenBean =  giteeOAuthService.exchangeCodeForAccessToken(code);
        Log.info("生成单点登录tokenBean：{}，并放入redis中", tokenBean);
        redisTemplate.opsForValue().set("token", tokenBean.getAccess_token(),3600*24, TimeUnit.SECONDS);


        GiteeUserTokenResp giteTokenResp = giteeOAuthService.tokenToUserInfo(tokenBean);
        Wikiuser user = new Wikiuser();
        user.setId(giteTokenResp.getId());
        user.setPassword(String.valueOf(giteTokenResp.getId()));
        user.setLoginName(giteTokenResp.getName());
        user.setName(giteTokenResp.getLogin());
        //保存到数据库

        userService.save(user);

        Log.info("用户信息：{}", giteTokenResp);
        giteTokenResp.setToken(String.valueOf(tokenBean.getAccess_token()));
        Log.info("用户信息+token ：{}", giteTokenResp);
        CommonResp<GiteeUserTokenResp> commonResp = new CommonResp<>();
        commonResp.setContent(giteTokenResp);
        return  commonResp;






//        return giteeOAuthService.exchangeCodeForAccessToken(code)
//                .map(responseEntity -> {
//                    // 这里可以根据需要进一步处理响应实体，例如提取access_token等信息
//                    String responseBody = responseEntity.getContent();
//
//                    // 使用JSON解析库来解析响应体，这里以Jackson为例
//                    ObjectMapper objectMapper = new ObjectMapper();
//
//                    JsonNode jsonNode = null;
//                    try {
//                        jsonNode = objectMapper.readTree(responseBody);
//                    } catch (JsonProcessingException e) {
//                        throw new RuntimeException(e);
//                    }
//                    String accessToken = jsonNode.get("access_token").asText();
//                    Log.info("生成单点登录token：{}，并放入redis中", accessToken);
//                    CommonResp<UserLoginResp> resp = new CommonResp<>();
//                    UserLoginResp  userLoginResp = userService.login(req);
//                    userLoginResp.setToken(String.valueOf(accessToken));
//
//                    redisTemplate.opsForValue().set(String.valueOf(accessToken), JSONObject.toJSONString(userLoginResp),3600*24, TimeUnit.SECONDS);
//
//                    resp.setContent(userLoginResp);
//
//                    // 可能需要将accessToken和其他用户信息一起处理或存储
//
//                    // 返回一个成功响应，这里直接使用了原始的responseBody，实际应用中可能根据需求调整
//                    return ResponseEntity.ok(responseBody);
//
//
//                });

    }

}
